package l.l.w.practice.运输桃子问题;

/**
 * 题目描述：
 *      A地有3000只桃子,现在,需要将这批桃子用一只猴子运输到B地.
 *      A地到B地的路程是1000公里,猴子每一次只能带1000只桃子,而且每一公里吃一只桃子,
 *      没有桃子吃,它是不肯走的.请问：如何做到最有效率地运输最多的桃子到B地呢?
 */
public class 运输桃子 {

    /**
     *
     * @param numOfPeach  总共有多少桃子需要运输
     * @param numOfPeachCarry 猴子一次能运输多少桃子
     * @param length2Destination 目的地距离
     * @return
     */
    public int getMaxPeachToDestination(int numOfPeach, int numOfPeachCarry, int length2Destination){
        //当需要运输的桃子 小于等于一次能运输的桃子数，就一次性的全部带着运输
        //如果到目的地的距离不大于0， 说明已经送到目的地
        while(numOfPeach > numOfPeachCarry && length2Destination > 0){
            //一次走一公里，需要运送多少次。如果总共三千个桃子，一次最多运1000个桃子，则需要三次运送。
            //且前两次分别需要去一次回一次，最后一次只需要去一次不需要回
            int times = (numOfPeach + numOfPeachCarry - 1) / numOfPeachCarry;
            //
            int needCarry = numOfPeach - (times - 1) * numOfPeachCarry;
            int pathLength = (int) Math.ceil(needCarry * 1.0 / ((times << 1) - 1));
            if(pathLength > length2Destination){
                numOfPeach -= times * pathLength;
                length2Destination = 0;
            }else if(pathLength == length2Destination){
                numOfPeach = numOfPeach - needCarry;
                length2Destination = 0;
            }else{
                numOfPeach = numOfPeach - needCarry;
                length2Destination -= pathLength;
            }
        }
        if(length2Destination > 0){
            numOfPeach -= length2Destination;
        }
        return numOfPeach;
    }

    public static void main(String[] args) {
        运输桃子 solution = new 运输桃子();
//        int result = solution.getMaxPeachToDestination(3000, 1000, 1000);
        int result = solution.getMaxPeachToDestination(1200, 1000, 400);
        System.out.println(result);
    }
}
